package scales.utils
trait AsBooleanTrait {
type AsBoolean[T] = Function1[T, Boolean]
def boolean[T : AsBoolean]( it : T ) : Boolean = implicitly[AsBoolean[T]].apply(it)
class BooleanMatcher[X, T : AsBoolean](eval : (X) => T) {
def unapply( x : X ) : Option[T] = {
val res = eval(x)
if (!implicitly[AsBoolean[T]].apply(res)) None
else Some(res)
}
}
class BooleanAndTMatcher[X, T : AsBoolean](eval : (X) => T) {
def unapply( x : X ) : Option[(T, X)] = {
val res = eval(x)
if (!implicitly[AsBoolean[T]].apply(res)) None
else Some((res, x))
}
}
def booleanMatcher[X, T : AsBoolean]( eval : (X) => T ) = new BooleanMatcher[X, T](eval)
def booleanAndTMatcher[X, T : AsBoolean]( eval : (X) => T ) = new BooleanAndTMatcher[X, T](eval)
}